package club.sinoexcel.oracle;

import oracle.jdbc.driver.OracleCallableStatement;
import oracle.jdbc.driver.OracleTypes;

import java.sql.*;

/**
 * 测试java调用存储过程
 * 测试java调用存储函数
 * 测试java调用游标返回值
 */
public class OracleTest {
    /**
     * 测试java调用存储过程的
     * @param args
     */
//    public static void main(String[] args){
//        //使用jdbc调用oracle存储过程
//        try {
//            //1.类加载器加载驱动：Class.forName();
//            Class.forName("oracle.jdbc.driver.OracleDriver");
//            //2.通过驱动管理器获取连接对象：Connection conn = DriverManager.getConnection();
//            Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.18.128:1521:orcl", "scott", "tiger");
//            //3.获取statement对象：参考jdbc调用存储过程的api
//            CallableStatement call = conn.prepareCall("{call findEmpReturn(?,?,?)}");
//            //4.设置参数
//            //4.1in参数：设置值
//            call.setInt(1, 7788);
//            //4.2out参数：注册数据类型
//            call.registerOutParameter(2, OracleTypes.VARCHAR);
//            call.registerOutParameter(3, OracleTypes.NUMBER);
//            //5.执行存储过程语句
//            call.execute();
//            //6.获取查询结果打印
//            String ename = call.getString(2);
//            int sal = call.getInt(3);
//            System.out.println("员工："+ename+"的薪水是："+sal);
//            call.close();
//            conn.close();
//        } catch (ClassNotFoundException e) {
//            e.printStackTrace();
//        } catch (SQLException e) {
//            e.printStackTrace();
//        }
//
//    }

    /**
     * java调用存储函数的
     * @param args
     */
//    public static void main(String[] args){
//        //使用jdbc调用oracle存储过程
//        try {
//            //1.类加载器加载驱动：Class.forName();
//            Class.forName("oracle.jdbc.driver.OracleDriver");
//            //2.通过驱动管理器获取连接对象：Connection conn = DriverManager.getConnection();
//            Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.18.128:1521:orcl", "scott", "tiger");
//            //3.获取statement对象：参考jdbc调用存储过程的api
//            CallableStatement call = conn.prepareCall("{?=call findEmpReturnFunc(?,?,?)}");
//            //4.设置参数
//            //4.1in参数：设置值
//            call.setInt(2, 7788);
//            //4.2out参数：注册数据类型
//            call.registerOutParameter(1, OracleTypes.NUMBER);
//            call.registerOutParameter(3, OracleTypes.VARCHAR);
//            call.registerOutParameter(4, OracleTypes.NUMBER);
//            //5.执行存储过程语句
//            call.execute();
//            //6.获取查询结果打印
//            String ename = call.getString(3);
//            int sal = call.getInt(4);
//            int annualsal = call.getInt(1);
//            System.out.println("员工："+ename+"的薪水是："+sal+"，年薪是"+annualsal);
//            call.close();
//            conn.close();
//        } catch (ClassNotFoundException e) {
//            e.printStackTrace();
//        } catch (SQLException e) {
//            e.printStackTrace();
//        }
//
//    }

    /**
     * java调用带有游标返回值的存储过程
     * @param args
     */
    public static void main(String[] args){
        //使用jdbc调用oracle存储过程
        try {
            //1.类加载器加载驱动：Class.forName();
            Class.forName("oracle.jdbc.driver.OracleDriver");
            //2.通过驱动管理器获取连接对象：Connection conn = DriverManager.getConnection();
            Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.18.128:1521:orcl", "scott", "tiger");
            //3.获取statement对象：参考jdbc调用存储过程的api
            CallableStatement call = conn.prepareCall("{call findDeptEmpAll(?,?)}");
            //4.设置参数
            //4.1in参数：设置值
            call.setInt(1, 20);
            //4.2out参数：注册数据类型
            call.registerOutParameter(2, OracleTypes.CURSOR);
            //5.执行存储过程语句
            call.execute();
            //6.获取查询结果打印
            OracleCallableStatement orclCall = (OracleCallableStatement) call;
            ResultSet rs = orclCall.getCursor(2);
            while(rs.next()){
                //有数据
                String ename = rs.getString("ename");
                int sal = rs.getInt("sal");
                System.out.println("员工："+ename+"的薪水是："+sal);
            }
            rs.close();
            orclCall.close();
            conn.close();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }

    }
}
